package com.cmcc.sdtp.client;

import java.io.BufferedReader;
import java.io.FileReader;
import java.nio.ByteBuffer;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.cmcc.sdtp.util.SdtpPropertiesUtil;

/**
 * @className：信息驱动
 * @author B
 * @date:
 * @version : 1.0
 */
public class Messagedispose {
	private static Logger log = LogManager.getLogger(Messagedispose.class);
	
	private static final String ifLingkAuthFancha = SdtpPropertiesUtil.getProperty("IF_LINGK_AUTH_FANCHA");


	Client clent = new Client();

	// 消息名 MessageType值 说明
	public static final int verNego_Req = 0x0001; // 版本协商请求
	public static final int verNego_Resp = 0x8001; // 版本协商应答
	public static final int linkAuth_Req = 0x0002; // 鉴权请求
	public static final int linkAuth_Resp = 0x8002;// 鉴权响应
	public static final int linkCheck_Req = 0x0003; // 链路检测请求
	public static final int linkCheck_Resp = 0x8003; // 链路检测应答
	public static final int linkRel_Req = 0x0004;// 连接释放请求
	public static final int linkRel_Resp = 0x8004; // 连接释放应答
	public static final int notifyXDRData_Req = 0x0005;// XDR数据通知请求
	public static final int notifyXDRData_Resp = 0x8005;// XDR数据通知应答
	public static final int XDRRawDataSend_Req = 0x0006;// XDR对应原始数据传输请求
	public static final int XDRRawDataSend_Resp = 0x8006;// XDR对应原始数据传输应答
	public static final int linkDataCheck_Req = 0x0007;// 链路数据发送校验请求
	public static final int linkDataCheck_Resp = 0x8007;// 链路数据发送校验应答
	public static final int XDRRawDataQuery_Req = 0x0008;// XDR数据反查请求
	public static final int XDRRawDataQuery_Resp = 0x8008;// XDR数据反查应答
	public static final int notifyKpiData_Req = 0x0009;// KPI数据通知请求
	public static final int notifyKpiData_Resp = 0x8009;// KPI数据通知应答
	public static final int[] MessageHeader = { 2, 2, 4, 1 };
	public static final int[] Header = { 2, 2, 16, 1, 8, 8, 16 };// 公共接口头文件
	public static final int[] GmHeader = { 1, 8, 8, 1, 1, 4, 16, 64, 64, 1, 16, 2, 1, 16, 2, 1, 64, 64, 64, 64, 1, 64, 64, 1, 64, 64, 1, 64, 64, 1, 64, 64, 1, 16, 2, 16, 2, 64, 1,
			64, 64, 64, 1, 4, 4, 32, 64, 32, 64, 16, 2, 16, 2, 1, 16, 2, 16, 2, 1, 32, 32, 32, 32, 1, 32, 32, 64, 1, 1, 2, 128, 128, 4, 1, 16, 4, 4, 4, 4, 4, 4 };// Gm接口/Mw接口/Mg接口/ISC接口XDR数据结构

	/**
	 * @comment 核心控制塔
	 * @author B
	 * @version: 1.0
	 * @return
	 */
	public ByteBuffer controller(int i, String s, long l) throws Exception{
		clent.initSocket();
		try {
			log.error("反查：Socket连接创建成功,是否开启版本校验和鉴权》!"+ifLingkAuthFancha);
			if(!"false".equals(ifLingkAuthFancha)){
				log.error("反查：版本校验开始");
				// 进行版本校验
				if (!clent.verNego_Req()) {
					log.error("反查：版本校验error!");
					clent.linkRel_Req();
					return null;
				}
				log.error("反查：版本校验成功！");

				log.error("反查：鉴权开始");
				// 进行链路鉴权
				if (!clent.linkAuth_Req()) {
					log.error("反查：链路鉴权error!");
					clent.linkRel_Req();
					return null;
				}
				log.error("反查：链路鉴权完成");
			}else{
				log.error("反查：不开启版本校验和链路鉴权");
			}
			log.error("反查：版本校验和链路鉴权成功，发送数据请求！");
			// 数据反查请求
			return clent.XDRRawDataQuery_Req(i, s, l);
		} catch (Exception e) {
			log.error("反查异常：",e);
			return null;
		} finally {
			// 链路释放请求
			clent.linkRel_Req();
			clent = null;
		}
//		return null;
	}


	public static byte[] createMessageHeader(int MessageType) {
		// MessageType 消息类型
		int TotalLength = 9;// 消息总长度(含消息头及消息体)
		switch (MessageType) {
		case verNego_Req:
			TotalLength += 2;
			break;
		case linkAuth_Req:
			TotalLength += 82;
			break;
		case linkCheck_Req:
			break;
		case linkRel_Req:
			TotalLength += 1;
			break;
		case notifyXDRData_Req:
			TotalLength += 681 + 48;
			break;
		case XDRRawDataSend_Req:
			TotalLength += 681 + 48;
			break;
		case linkDataCheck_Req:
			TotalLength += 8;
			break;
		case XDRRawDataQuery_Req:
			TotalLength += 25;
			break;
		case notifyKpiData_Req:
			TotalLength += 681 + 48;
			break;
		default:
			break;
		}
		log.debug("请求信息总长度" + TotalLength);
		int SequenceId = 1;// 交互的流水号，顺序累加，步长为1，循环使用（一个交互的一对请求和应答消息的流水号必须相同）
		int TotalContents = 1;// 消息体中的事件数量（最多40条） 若考虑实时性要求，可每次只填一个事件
		String[] m = { TotalLength + "", MessageType + "", SequenceId + "", TotalContents + "" };
		return Util.encodeToSendbytes(m, MessageHeader);
	}

	/**
	 * @comment 解析头文件，仅返回信息类型
	 * @author B
	 * @version: 1.0
	 * @return
	 */
	public static int unpackMessageHeader(byte[] header) {
		return Util.unbuildNumericWithSpace(header, 2);
	}

	public static int unpackMessageHeader2(byte[] header) {
		return Util.unbuildNumericWithSpace2(header, 2);
	}

	public static void main(String[] args) {
//		try {
//			clent.initSocket();
//			Messagedispose m = new Messagedispose();
//			m.controller();
//		} catch (IOException e) {
//			e.printStackTrace();
//		}
	}

	public static String[] getS() {
		BufferedReader br;
		String[] s = new String[10000];
		try {
			br = new BufferedReader(new FileReader("D:/Test.txt"));

			String data = br.readLine();// 一次读入一行，直到读入null为文件结束
			int i = 0;
			while (Util.checkNotNull(data)) {
				s[i] = data;
				i++;
				data = br.readLine(); // 接着读下一行
			}
		} catch (Exception e) {
			log.error("读取文件内容失败："+e);
			e.printStackTrace();
		}
		return s;
	}

}